#include "CLUT2.h"

////////////////////////////////////////////////////////////////////////////////////////////
//CLUT management
////////////////////////////////////////////////////////////////////////////////////////////
bool loadCLUT(string filename, cv::SparseMat & clut)
{

}

bool saveCLUT(string filename, cv::SparseMat & clut)
{

}

////////////////////////////////////////////////////////////////////////////////////////////
//FuzzyCLUT management
////////////////////////////////////////////////////////////////////////////////////////////
bool loadFuzzyCLUT(string filename, cv::SparseMat & fuzzyclut)
{
	ifstream stream(filename.c_str());
	
	if(stream)
	{
		string type;
		getline(stream, type);
		if(type==string("FUZZY_CLUT"))
		{
			int resX=0,resY=0,resZ=0;
			stream>>resX>>resY>>resZ;
			int depth=0;
			stream>>depth;
			
			int size[]={resX,resY,resZ};
			fuzzyclut.create(3,size,CV_32F);
			
			string line;
			
			int index=0;
			while(getline(stream, line))
			{
				std::vector<float> splited_line = split(line,';',float());
				
				if(splited_line.size()==depth)
				{
					for(int i=0;i<depth;i++)
					{
						FuzzyCLUT(fuzzyclut,index,i,splited_line[i]);
					}
					index++;
				}
				else
				{
					return false;
				}
				
			}
			
			stream.close();
			return true;
		}
		else
		{
			return false;
		}
	}
	else
	{
		return false;
	}
}

bool saveFuzzyCLUT(string filename, cv::SparseMat & fuzzyclut)
{
	ofstream stream(filename.c_str());
	if(stream)
	{
		stream<<"FUZZY_CLUT"<<endl;
		stream<<fuzzyclut.size(0)<<endl;
		stream<<fuzzyclut.size(3)<<endl;
		
		for(int i=0;i<fuzzyclut.size(0);i++)
		{
			for(int j=0;j<fuzzyclut.size(1);j++)
			{
				for(int k=0;k<fuzzyclut.size(2);k++)
				{
					for(int l=0;l<fuzzyclut.size(3);l++)
					{
						int id[]={i,j,k,l};
						stream<<fuzzyclut.ref<float>(id)<<";";
					}
					stream<<endl;
				}
			}
		}
		stream.close();
		return true;
	}
	else
	{
		return false;
	}
}

bool createFromDataFuzzyCLUT(string filename, int res, int depth, cv::SparseMat & fuzzyclut)
{

}

void normalizeFuzzyCLUT(cv::SparseMat & fuzzyclut)
{

}

void gaussianKernelFuzzyCLUT(cv::SparseMat & fuzzyclut,float kernel_sigma, int kernel_size)
{

}

////////////////////////////////////////////////////////////////////////////////////////////
//Convert FuzzyCLUT --> CLUT
////////////////////////////////////////////////////////////////////////////////////////////
void maxFuzzyCLUT_2_CLUT(cv::SparseMat & fuzzyclut, cv::SparseMat & clut)
{

}
void entropyFuzzyCLUT_2_CLUT(cv::SparseMat & fuzzyclut, cv::SparseMat & clut)
{

}

////////////////////////////////////////////////////////////////////////////////////////////
//Access Fonctions
////////////////////////////////////////////////////////////////////////////////////////////
uchar CLUT(cv::SparseMat & clut,uchar r,uchar g,uchar b)
{

}
void CLUT(cv::SparseMat & clut,uchar r,uchar g,uchar b,uchar classe)
{

}

float FuzzyCLUT(cv::SparseMat & fuzzyclut,uchar r,uchar g,uchar b,uchar classe)
{

}
void FuzzyCLUT(cv::SparseMat & fuzzyclut,uchar x,uchar y,uchar y,uchar classe, float prob)
{
	fuzzyclut.ret<float>(x,y,z,classe)=prob;
}
void FuzzyCLUT(cv::SparseMat & fuzzyclut,int index,uchar classe, float prob)
{
	
	fuzzyclut.ret<float>(r,g,b,classe)=prob;	
}

////////////////////////////////////////////////////////////////////////////////////////////
//Apply on Images
////////////////////////////////////////////////////////////////////////////////////////////
void RGB_2_Cn(cv::Mat & src, cv::SparseMat & clut, cv::Mat & des)
{

}
void Cn_2_RGBn(cv::Mat & src, cv::Mat & des)
{

}
void RGB_2_RGBn(cv::Mat & src, cv::SparseMat & clut, cv::Mat & des)
{
	
}
